import os
import sqlalchemy
from sqlalchemy import Column, Integer, String, create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from databases import Database

# 定义数据库文件路径
DATABASE_URL = "sqlite:///./test_async.db"

# 创建数据库引擎
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})

# 使用 SQLAlchemy 的 metadata 和 Base 来定义模型
metadata = MetaData()
Base = sqlalchemy.orm.declarative_base()

# 定义示例表
class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    age = Column(Integer)

# 创建数据库连接
database = Database(DATABASE_URL)

# 创建表的异步函数
async def create_tables():
    # 检查文件是否存在，如果数据库文件不存在则创建
    if not os.path.exists("./test_async.db"):
        # 连接数据库，并创建表
        Base.metadata.create_all(engine)
        print("数据库和表已创建")
    else:
        # 如果数据库文件已存在但没有表，则创建表
        inspector = sqlalchemy.inspect(engine)
        if not inspector.has_table("users"):
            Base.metadata.create_all(engine)
            print("表已创建")
        else:
            print("表已存在")

# 插入数据的异步函数
async def add_user(name: str, age: int):
    query = User.__table__.insert().values(name=name, age=age)
    
    await database.execute(query)

# 查询数据的异步函数
async def get_users():
    query = User.__table__.select()
    results = await database.fetch_all(query)
    return results

# 主函数：启动数据库连接，创建表，插入数据并查询数据
async def main():
    await database.connect()
    await create_tables()
    await add_user("Alice", 25)
    await add_user("Bob", 30)
    users = await get_users()
    for user in users:
        print(f"ID: {user['id']}, Name: {user['name']}, Age: {user['age']}")
    await database.disconnect()

# 运行主程序
import asyncio
asyncio.run(main())
